package 对象及变量的并发访问;
//"非线程安全":其实就是在多个线程对同一个对象实例变量进行的并发访问时发生的，产生的后果就是"脏读"也就是取到的数据其实是被更改过的
//"非线程安全"问题存在于"实例变量"中，如果方法内部的私有变量，则不存在"非线程安全"问题，所得的结果就是"线程安全"
//"线程安全":就是获得的实例变量的值是经过同步处理的，不会出现"脏读".
//
class HasSelfPrivateNumOne{
	private int num=0;
	synchronized public void addI(String username)//加上synchronied就不会发生"非线程安全"的问题
	{try {
		
			if(username.equals("a"))
			{
				num=100;
				System.out.println("a set over!");
				Thread.sleep(2000);
				
			}
			else
			{
				num=200;
				System.out.println("b set over!");
			}
			System.out.println(username+" num="+num);
		}catch(InterruptedException e)
			{
					e.printStackTrace();
			}
	}
}
class ThreadAA extends Thread{
	private  HasSelfPrivateNumOne numRef;
	public ThreadAA(HasSelfPrivateNumOne numRef)
	{
		super();
		this.numRef=numRef;
		
	}
	public void run()
	{
		super.run();
		numRef.addI("a");
	}
}
class ThreadBB extends Thread{
	private HasSelfPrivateNumOne numRef;
	public ThreadBB(HasSelfPrivateNumOne numRef)
	{
		super();
		this.numRef=numRef;
		
	}
	public void run()
	{
		super.run();
		numRef.addI("b");
	}
}

public class Test2_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HasSelfPrivateNumOne	numRef=new HasSelfPrivateNumOne();
		ThreadAA athread=new ThreadAA(numRef);
		athread.start();
		ThreadBB bthread=new ThreadBB(numRef);
		bthread.start();
		

	}

}
